package com.zerocarbon.framework.common.utils;

import cn.hutool.core.bean.BeanUtil;

import java.util.*;
import java.util.stream.Collectors;

/**
 * Bean增强类工具类
 * <p>
 * 把一个拥有对属性进行set和get方法的类，我们就可以称之为JavaBean。
 * </p>
 * @author wyf  2020年5月31日
 */
public class BeanPlusUtil extends BeanUtil {

    /**
     * 转换 list
     * @param sourceList
     * @param destinationClass
     * @param <T>
     * @param <E>
     * @return
     */
    public static <T, E> List<T> toBeanList(Collection<E> sourceList, Class<T> destinationClass) {
        if (sourceList == null || sourceList.isEmpty() || destinationClass == null) {
            return Collections.emptyList();
        }
        return sourceList.parallelStream()
                .filter(item -> item != null)
                .map((source) -> toBean(source, destinationClass))
                .collect(Collectors.toList());
    }
    
    /**
     * 转换 list, 支持命名‘id’的主键ID值，拷贝到其他命名的主键值
     * @param sourceList			数据源
     * @param destinationClass		目标对象类
     * @param toPrimaryId			是否赋值到命名为ID的对象，ture：比如 userId——>id  false: id——>userId
     * @param fieldName				非id字段名称，如userId
     * @return
     */
    @SuppressWarnings("serial")
	public static <T, E> List<T> toBeanList(Collection<E> sourceList, Class<T> destinationClass, boolean toPrimaryId, String fieldName) {
    	if(toPrimaryId) {  // fieldName->id
    		return toBeanList(sourceList, destinationClass, new HashMap<String, String>() {{
    			put(fieldName, "id"); 
    		}});
    	} else {
    		return toBeanList(sourceList, destinationClass, new HashMap<String, String>() {{
    			put("id", fieldName); 
    		}});
    	}
    }
    
    /**
     * 转换 list,支持不同名称属性的替换，通过Map参数传递替换关系
     * @param sourceList
     * @param destinationClass
     * @param fields
     * @return
     */
    public static <T, E> List<T> toBeanList(Collection<E> sourceList, Class<T> destinationClass, Map<String, String> fields) {
        if (sourceList == null || sourceList.isEmpty() || destinationClass == null) {
            return Collections.emptyList();
        }
        return sourceList.parallelStream().filter(item -> item != null).map((source) -> {
        	T result = toBean(source, destinationClass);
        	for (Map.Entry<String, String> entry : fields.entrySet()) {
        		setFieldValue(result, entry.getValue(), getFieldValue(source, entry.getKey()));
        	}
        	return result;
        }).collect(Collectors.toList());
    }

//    /**
//     * 转化Page 对象
//     *
//     * @param page
//     * @param destinationClass
//     * @param <T>
//     * @param <E>
//     * @return
//     */
//    public static <T, E> IPage<T> toBeanPage(IPage<E> page, Class<T> destinationClass) {
//        if (page == null || destinationClass == null) {
//            return null;
//        }
//        IPage<T> newPage = new Page<>(page.getCurrent(), page.getSize());
//        newPage.setPages(page.getPages());
//        newPage.setTotal(page.getTotal());
//
//        List<E> list = page.getRecords();
//        if (CollUtil.isEmpty(list)) {
//            return newPage;
//        }
//
//        List<T> destinationList = toBeanList(list, destinationClass);
//
//        newPage.setRecords(destinationList);
//        return newPage;
//    }

}
